/* 
 * File:   DataSet.cpp
 * Author: shadius
 * 
 * Created on 11. listopad 2012, 15:29
 */

#include "DataSet.h"

DataSet::DataSet(int x) :
		p_vector(new vector<double>()) {

}

DataSet::~DataSet() {
}

void DataSet::add(int x, double value) {
//	cout << value << endl;

	//(*p_matrix)(x, y) = value;
	p_vector->push_back(value);
//double c = (*p_matrix)(x, y);
}

double DataSet::get(int x, int y) {
	return 0.0;
}

HRESULT WINAPI DataSet::AddBuf(LPAPPROXPOINT points, int len, int *added) {
	return (E_NOTIMPL);
}

//získá aproximované hodnoty b(t) či i(t)
//points[0].X je čas, tj. t, první hodnoty, points[1].X = points[0].X+step, atd.
//len je velikost *points v APPROXPOINTS
//*filled bude po návratu z volání funkce obsahovat počet vyplněných prvků *points

//vrací S_OK pokud je vše v pořádku
//S_FALSE pokud bylo zadáno příliš málo dat, než aby šla aproximovat
//E_INVALIDARG pookud je špatný některý ze vstupních parametrů
//případně jiný relevatní kód viz http://msdn.microsoft.com/en-us/library/windows/desktop/aa378137%28v=vs.85%29.aspx
HRESULT WINAPI DataSet::GetBuf(LPAPPROXPOINT points, floattype step, int len,
		int *filled) {
	//TODO: nikdo necekuje navratovy hodnoty
	if(step <= 0 || points == NULL) {
		return E_INVALIDARG;
	}

	if (len > (int) (p_vector->size())) {
		return S_FALSE;
	}
	double actWinTime = 0;
	int filledCount = 0;
	for (int i = 0; i < len; i++) {
		points[i].x = actWinTime;
		int precPoint = -1;
		GetPrecedingPoint(actWinTime, &precPoint);
		points[i].y =     (*p_vector)[precPoint];
				//(*p_matrix)(COLUMN_VALUE, precPoint); //TODO:SMT STRANGE
		actWinTime += step;
		filledCount++;
	}
	*filled = filledCount;
	return S_OK;
}

HRESULT WINAPI DataSet::EnumBuf(int *index, LPAPPROXPOINT points, int len,
		int *filled) {
	return E_NOTIMPL;
}

HRESULT WINAPI DataSet::GetPrecedingPoint(floattype x, int *index) {
	*index = TimeUtils::convertWinToSec(x);
	return S_OK;
}

HRESULT WINAPI DataSet::Count(int *cnt) {
	*cnt = (int) p_vector->size();
	return S_OK;
}

HRESULT WINAPI DataSet::Clear(int start, int stop) {
	return E_NOTIMPL;
}
